Prop
在 vue.js 中, 使用prop
可以实现父组件向子组件传递值,在子组件中的 props
中的数据将会和父组件中传递的相应的 prop
保持一致,在传递 prop
的时候,可以传递一个数组, 例如:1 | props: ['data1', 'data2', 'data3' ...] |
type
以及 default
属性:1 | props: { |
初始化 props
在 initState
中:当当前组件中存在 props
的时候, 对于 props
执行 initProps
进行初始化:1 | function initState (vm) { |
initProps
中接受两个参数: vm
当前 vue 的实例, propsOptions
在当前组件中规范化后的 props
对象在执行initProps
方法之前, 在vm.$options
属性中的props
属性中已经对于传递的props
进行了规范化处理为下面的这种形式:
1
2
3
4
5 >test: {
> type: sometype,
> default: // 默认值, 如果没有传, 那么就没有
>}
>
initProps
:1 | // 用于初始化 props 对象 |
1 | var propsData = vm.$options.propsData || {}; // 获取到父组件传递到子组件中的值 |
toggleObserving
方法用来切换是否对与数据进行监听的开关函数:1 |
|
shouldObserve
的值, 这个值的作用我们后面在说, 现在, 我们先看下在 initProps
中的 for in
中的 loop
方法:1 | for (var key in propsOptions) loop(key); |
loop
方法:loop
方法:1 | // key prop 值 |
validateProp
方法, 这个方法定义如下:1 | /** |
prop
: 当前传入 prop 值的对象absent
: 布尔值, 当前 prop 有没有被父组件传入value
: 父组件传入的 prop 的值, 如果没有传入,为 undefined
booleanIndex
: 是通过 getTypeIndex
方法返回的, 这个方法的作用是:当 prop 中声明的 type 中包含有布尔值的时候, 如果 type 为 String, 返回 0, 如果 type 为数组, 返回这个 Boolean 值在 type 数组中的顺序 index, 如果不包含布尔值, 那么返回 -1getTypeIndex
:1 | // expectedTypes: prop 中声明的 type |
isSameType
方法来进行比较者两个 type 是否相等:1 | /** |
getType
中, 调用 fn.toString()
方法, 再通过正则表达式获取到 (\w+)
内的内容,例如:因为, 在 js 中例如Boolean
,String
之类的类型, 都是代表着一个个的函数方法, 对于这个函数, 可以调用 toString
1 | Boolean |
Boolean
字段的时候1 | // 当 prop 的type中包含有 “Boolean” 的时候 |
1 | export default { |
1 | <child prop-data=""></child> |
propData
值为 true
;或者, 当在父组件中如下定义的时候:1 | <child prop-data="propData"></child> |
true
,总之:当定义的 prop 接受值的类型,Boolean
值类型优先级要高于 String
的时候(在 type 中 Boolean
在 String
前面 [Boolean, String]
):- 当传递的值为空字符串的时候, 接受到的prop 值变为
true
- 当传递的值为字符串并且和驼峰后的 prop 名相同的时候, 接受的值也将转为
true
default
属性, 当校验 type
中包含有Boolean
的时候, 这个时候, 获取这个 prop
的值将为 false
child.vue
组件中:1 | export default { |
1 | <child></child> |
child.vue
组件中获取到 propData
的值为 false
;